// **************************************************************
// COPYRIGHT(c)2022, Xidian University
// All rights reserved.
//
// IP LIB INDEX :  
// IP Name      :      
// File name    :  
// Module name  :  
// Full name    :  
// Time         : 2022
// Author       : Wang-Zhenuyu 
// Email        : 2047593704@qq.com
// Data         : 
// Version      : V 2.0 
// 
// Abstract     :
// Called by    :  
// 
// Modification history
// -----------------------------------------------------------------
// 
// 
//
// *****************************************************************

//*************************
//TIMESCALE
//*************************
`timescale 1ns/1ps

//*************************
//INFORMATION
//*************************

//*************************
//DEFINE(s)
//*************************

//*************************
//DEFINE MODULE PORT
//*************************
module pkt_analysis_ctl(
    //数据输入
    input wire rst_n,
    input wire pkt_clk_i,
    input wire pkt_sop_i,
    input wire pkt_eop_i,
    input wire[255:0] pkt_data_i,
    input wire[1:0] pkt_mod_ctl,
    input wire pkt_dval_i,
    input wire[4:0] pkt_mod_i,
    //数据输出
    output wire[8:0] layend,
    //output wire layend_en,
    output wire[0:1023] match_field,
    output wire analyser_is_working_o,
    output wire analyser_is_done_o
    //output wire[263:0] payload,
    //output wire payload_en
);
//*************************
//INNER SIGNAL DECLARATION
//*************************
//REGS
reg pkt_sop_o;
reg pkt_eop_o;
reg pbb_uca;
reg[23:0] pbb_i_sid;
reg pkt_sop_d1;
reg pkt_eop_d1;
reg[255:0] pkt_data_d1;
reg[255:0] pkt_data_d2;
reg is_pbb;
reg analyser_is_working;
//WIRE
wire[255:0] pkt_data_o;
wire[8:0] layend_1,layend_2,layend_3,layend_4;
//wire layend_en_1,layend_en_2;
wire[1023:0] match_field_1,match_field_2,match_field_3,match_field_4;
wire analyser_is_working_1,analyser_is_working_2,analyser_is_working_3,analyser_is_working_4;
wire analyser_is_done_1,analyser_is_done_2,analyser_is_done_3,analyser_is_done_4;
//wire[263:0] payload_1,payload_2,payload_3,payload_4;

//***********************
//MAIN CODE
//***********************
always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        pkt_sop_d1 <= 1'b0;
        pkt_sop_o <= 1'b0;
    end
    else
    begin
        pkt_sop_d1 <= pkt_sop_i;
        pkt_sop_o  <= pkt_sop_d1;
    end
end

always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        pkt_eop_d1 <= 1'b0;
        pkt_eop_o <= 1'b0;
    end
    else
    begin
        pkt_eop_d1 <= pkt_eop_i;
        pkt_eop_o  <= pkt_eop_d1;
    end
end

always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        pkt_data_d1 <= 0;
        pkt_data_d2 <= 0;
    end
    else
    begin
        pkt_data_d1 <= pkt_data_i;
        pkt_data_d2 <= pkt_data_d1;
    end
end
always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        is_pbb <= 1'b0;
    end
    else if(pkt_sop_d1)// && pkt_data_d1[159:144]==16'h88a8 && pkt_data_d1[127:112]==16'h88E7)
    begin
        if(pkt_data_d1[159:144]==16'h88a8 && pkt_data_d1[127:112]==16'h88E7)
        begin
            is_pbb <= 1'b1;
        end
        else
        begin
            is_pbb <= 1'b0;
        end
    end
    else
    begin
        is_pbb <= is_pbb;
    end
end

always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        pbb_uca <= 1'b0;
    end
    else if(pkt_sop_o)
    begin
        if(is_pbb)
        begin
            pbb_uca <= pkt_data_d2[107];//PBB的UCA
        end
        else
        begin
        pbb_uca <= 1'b0;
        end
    end
    else
    begin
        pbb_uca <= pbb_uca;
    end
end

always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        pbb_i_sid <= 24'b0;
    end
    else if(pkt_sop_o)// && is_pbb
    begin
        if(is_pbb)
        begin
            pbb_i_sid <= pkt_data_d2[103:80];
        end
        else
        begin
            pbb_i_sid <= 24'b0;
        end
    end
    else
    begin
        pbb_i_sid <= pbb_i_sid;
    end
end
always@(posedge pkt_clk_i or negedge rst_n)
begin
    if(!rst_n)
    begin
        analyser_is_working <= 1'b0;
    end
    else if(pkt_sop_i)
    begin
        analyser_is_working <= 1'b1;
    end
    else if(pkt_sop_o)
    begin
        analyser_is_working <= 1'b0;
    end
    else
        analyser_is_working <= analyser_is_working;
end  

assign pkt_data_o = (is_pbb) ? {pkt_data_d2[79:0],pkt_data_d1[255:80]} : pkt_data_d2[255:0];
assign layend = (pkt_mod_ctl==2'b00) ? layend_1 : (pkt_mod_ctl==2'b01) ? layend_2 : (pkt_mod_ctl==2'b10) ? layend_3 : layend_4 ;
assign match_field = (pkt_mod_ctl==2'b00) ? match_field_1 : (pkt_mod_ctl==2'b01) ? match_field_2 : (pkt_mod_ctl==2'b10) ? match_field_3 : match_field_4;
assign analyser_is_working_o = (pkt_mod_ctl==2'b00) ? (analyser_is_working_1||analyser_is_working) : (pkt_mod_ctl==2'b01) ? (analyser_is_working_2||analyser_is_working) : 
                               (pkt_mod_ctl==2'b10) ? (analyser_is_working_3||analyser_is_working) : (analyser_is_working_4||analyser_is_working);
assign analyser_is_done_o = (pkt_mod_ctl==2'b00) ? analyser_is_done_1 : (pkt_mod_ctl==2'b01) ? analyser_is_done_2 : (pkt_mod_ctl==2'b10) ? analyser_is_done_3 : analyser_is_done_4;
//assign payload = (pkt_mod_ctl==2'b00) ? payload_1 : (pkt_mod_ctl==2'b01) ? payload_2 : 264'b0;

pkt_analysis_m1 pkt_analysis_m1_u(
    .rst_n(rst_n),
    .pkt_clk_i(pkt_clk_i),
    .pkt_sop_i(pkt_sop_o),
    .pkt_eop_i(pkt_eop_o),
    .pkt_data_i(pkt_data_o),
    .pbb_uca(pbb_uca),
    .pbb_i_sid(pbb_i_sid),
    .layend(layend_1),
    //.layend_en(layend_en_1),
    .match_field(match_field_1),
    .analyser_is_working_o(analyser_is_working_1),
    .analyser_is_done_o(analyser_is_done_1)
    //.payload(payload_1),
    //.payload_en(payload_en_1)
    );
pkt_analysis_m2 pkt_analysis_m2_u(
    .rst_n(rst_n),
    .pkt_clk_i(pkt_clk_i),
    .pkt_sop_i(pkt_sop_o),
    .pkt_eop_i(pkt_eop_o),
    .pkt_data_i(pkt_data_o),
    .pbb_uca(pbb_uca),
    .pbb_i_sid(pbb_i_sid),
    .layend(layend_2),
    //.layend_en(layend_en_2),
    .match_field(match_field_2),
    .analyser_is_working_o(analyser_is_working_2),
    .analyser_is_done_o(analyser_is_done_2)
    //.payload(payload_2),
    //.payload_en(payload_en_2)
    );
pkt_analysis_m3 pkt_analysis_m3_u(
    .rst_n(rst_n),
    .pkt_clk_i(pkt_clk_i),
    .pkt_sop_i(pkt_sop_o),
    .pkt_eop_i(pkt_eop_o),
    .pkt_data_i(pkt_data_o),
    .pbb_uca(pbb_uca),
    .pbb_i_sid(pbb_i_sid),
    .layend(layend_3),
    //.layend_en(layend_en_3),
    .match_field(match_field_3),
    .analyser_is_working_o(analyser_is_working_3),
    .analyser_is_done_o(analyser_is_done_3)
    //.payload(payload_3),
    //.payload_en(payload_en_3)
    );
pkt_analysis_m4 pkt_analysis_m4_u(
    .rst_n(rst_n),
    .pkt_clk_i(pkt_clk_i),
    .pkt_sop_i(pkt_sop_o),
    .pkt_eop_i(pkt_eop_o),
    .pkt_data_i(pkt_data_o),
    .pbb_uca(pbb_uca),
    .pbb_i_sid(pbb_i_sid),
    .layend(layend_4),
    //.layend_en(layend_en_4),
    .match_field(match_field_4),
    .analyser_is_working_o(analyser_is_working_4),
    .analyser_is_done_o(analyser_is_done_4)
    //.payload(payload_4),
    //.payload_en(payload_en_4)
    );
endmodule